home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2007 June
/
PCWorld_2007-06_cd.bin
/
v cisle
/
tclock
/
tclocklight-040702-3.exe
/
source
/
exe
/
wndproc.c
< prev
Wrap
C/C++ Source or Header
|
2004-03-16
|
8KB
|
330 lines
/*-------------------------------------------------------------
wndproc.c : window procedure of tclock.exe
(C) 1997-2003 Kazuto Sato
Please read readme.txt about the license.
Written by Kazubon, Nanashi-san
---------------------------------------------------------------*/
#include "tclock.h"
/* Globals */
LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam);
HWND g_hwndClock = NULL; // clock window
/* Statics */
static void OnCreate(HWND hwnd);
static void OnDestroy(HWND hwnd);
static void ClearTClockMain(HWND hwnd);
static void OnTimerStart(HWND hwnd);
static void OnTimerMain(HWND hwnd);
static void OnTCMHwndClock(HWND hwnd, LPARAM lParam);
static void OnTCMClockError(HWND hwnd, LPARAM lParam);
static void OnTCMExit(HWND hwnd);
static void OnTCMReloadSetting(HWND hwnd);
static void OnTaskbarRestart(HWND hwnd);
static void OnCopyData(HWND hwnd, HWND hwndFrom, COPYDATASTRUCT* pcds);
static void InitError(int n);
static BOOL m_bHook = FALSE;
static BOOL m_bStartTimer = FALSE;
/*-------------------------------------------
the window procedure
---------------------------------------------*/
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
OnCreate(hwnd);
return 0;
case WM_DESTROY:
OnDestroy(hwnd);
return 0;
case WM_ENDSESSION:
if(wParam) ClearTClockMain(hwnd);
break;
case WM_TIMER:
switch (wParam)
{
case IDTIMER_START:
OnTimerStart(hwnd); break;
case IDTIMER_MAIN:
OnTimerMain(hwnd); break;
case IDTIMER_MOUSE:
// mouse.c
OnTimerMouse(hwnd); break;
case IDTIMER_MONOFF:
KillTimer(hwnd, wParam);
SendMessage(GetDesktopWindow(), WM_SYSCOMMAND,
SC_MONITORPOWER, 2);
break;
}
return 0;
// menu and commands
case WM_COMMAND:
// command.c
OnTClockCommand(hwnd, LOWORD(wParam), HIWORD(wParam));
return 0;
case WM_CONTEXTMENU:
// menu.c
OnContextMenu(hwnd, (HWND)wParam, LOWORD(lParam), HIWORD(lParam));
return 0;
case WM_EXITMENULOOP:
// menu.c
OnExitMenuLoop(hwnd);
return 0;
// messages sent/posted from other programs
case TCM_HWNDCLOCK:
OnTCMHwndClock(hwnd, lParam);
return 0;
case TCM_CLOCKERROR:
OnTCMClockError(hwnd, lParam);
return 0;
case TCM_EXIT:
OnTCMExit(hwnd);
return 0;
case TCM_RELOADSETTING:
OnTCMReloadSetting(hwnd);
return 0;
// case TCM_REQUESTSNTPLOG:
// // sntp.c
// OnTCMRequestSNTPLog(hwnd, (HWND)wParam);
// return 0;
case WM_COPYDATA:
OnCopyData(hwnd, (HWND)wParam, (COPYDATASTRUCT*)lParam);
return 0;
case MM_MCINOTIFY:
// common/playfile.c
OnMCINotify(hwnd, wParam, (LONG)lParam);
return 0;
case MM_WOM_DONE: // stop playing wave
case TCM_STOPSOUND:
StopFile();
return 0;
/* -------- mouse ---------- */
case WM_DROPFILES:
OnDropFiles(hwnd, (HDROP)wParam); // mouse2.c
return 0;
case WM_MOUSEWHEEL:
OnMouseWheel(hwnd, wParam, lParam); // mouse2.c
return 0;
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_XBUTTONDOWN:
StopFile();
OnMouseDown(hwnd, message, wParam, lParam); // mouse.c
return 0;
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
case WM_XBUTTONUP:
OnMouseUp(hwnd, message, wParam, lParam); // mouse.c
return 0;
}
if(message == g_uTaskbarRestart)
OnTaskbarRestart(hwnd);
return DefWindowProc(hwnd, message, wParam, lParam);
}
/* ------------------------------- Statics -------------------------------- */
/*-------------------------------------------------------
WM_CREATE message
---------------------------------------------------------*/
void OnCreate(HWND hwnd)
{
int nDelay;
InitAlarm(); // alarm.c
InitMouseFunction(hwnd); // mouse.c
// InitSNTP(hwnd); // sntp.c
// delay starting
nDelay = GetMyRegLong(NULL, "DelayStart", 0);
if(nDelay > 0)
{
SetTimer(hwnd, IDTIMER_START, nDelay * 1000, NULL);
m_bStartTimer = TRUE;
}
else OnTimerStart(hwnd);
SetTimer(hwnd, IDTIMER_MAIN, 1000, NULL);
}
/*-------------------------------------------------------
WM_DESTROY message
---------------------------------------------------------*/
void OnDestroy(HWND hwnd)
{
ClearTClockMain(hwnd);
PostQuitMessage(0);
}
/*-------------------------------------------------------
clear up
---------------------------------------------------------*/
void ClearTClockMain(HWND hwnd)
{
static BOOL bCleared = FALSE;
if(bCleared) return;
bCleared = TRUE;
if(g_hDlgAbout && IsWindow(g_hDlgAbout))
DestroyWindow(g_hDlgAbout);
// EndSNTP(hwnd);
StopFile();
EndMouseFunction(hwnd);
EndAlarm();
EndMenu();
KillTimer(hwnd, IDTIMER_MAIN);
if(m_bStartTimer) KillTimer(hwnd, IDTIMER_START);
m_bStartTimer = FALSE;
if(m_bHook) HookEnd(); // dll/main.c - uninstall the hook
m_bHook = FALSE;
}
/*-------------------------------------------------------
WM_TIMER message, wParam = IDTIMER_START
start customizing the tray clock
---------------------------------------------------------*/
void OnTimerStart(HWND hwnd)
{
if(m_bStartTimer) KillTimer(hwnd, IDTIMER_START);
m_bStartTimer = FALSE;
if(!m_bHook)
m_bHook = HookStart(hwnd); // dll/main.c - install a hook
OnTimerAlarm(hwnd, NULL, 1); // alarm.c
}
/*-------------------------------------------------------
WM_TIMER message, wParam = IDTIMER_MAIN
---------------------------------------------------------*/
void OnTimerMain(HWND hwnd)
{
static BOOL bTimerAdjusting = FALSE;
SYSTEMTIME st;
GetLocalTime(&st);
// adjusting milliseconds gap
if((st.wMilliseconds > 200 ||
((g_winver | WINNT) && st.wMilliseconds > 50)))
{
KillTimer(hwnd, IDTIMER_MAIN);
SetTimer(hwnd, IDTIMER_MAIN, 1001 - st.wMilliseconds, NULL);
bTimerAdjusting = TRUE;
}
else if(bTimerAdjusting)
{
KillTimer(hwnd, IDTIMER_MAIN);
bTimerAdjusting = FALSE;
SetTimer(hwnd, IDTIMER_MAIN, 1000, NULL);
}
OnTimerAlarm(hwnd, &st, 0); // alarm.c
// OnTimerSNTP(hwnd); // sntp.c
}
/*-------------------------------------------------------
TCM_HWNDCLOCK message
---------------------------------------------------------*/
void OnTCMHwndClock(HWND hwnd, LPARAM lParam)
{
g_hwndClock = (HWND)lParam;
}
/*-------------------------------------------------------
TCM_CLOCKERROR message
---------------------------------------------------------*/
void OnTCMClockError(HWND hwnd, LPARAM lParam)
{
char s[160];
wsprintf(s, "%s: %d", "failed to start TClock.", lParam);
MessageBox(NULL, s, "Error", MB_OK|MB_ICONEXCLAMATION);
PostMessage(hwnd, WM_CLOSE, 0, 0);
}
/*-------------------------------------------------------
TCM_EXIT message
---------------------------------------------------------*/
void OnTCMExit(HWND hwnd)
{
if(g_hwndClock)
PostMessage(g_hwndClock, CLOCKM_EXIT, 0, 0);
}
/*-------------------------------------------------------
TCM_RELOADSETTING message
---------------------------------------------------------*/
void OnTCMReloadSetting(HWND hwnd)
{
InitAlarm(); // alarm.c
InitMouseFunction(hwnd); // mouse.c
}
/*-------------------------------------------------------
When Explorer is hung up,
and the taskbar is recreated.
---------------------------------------------------------*/
void OnTaskbarRestart(HWND hwnd)
{
if(m_bHook) HookEnd();
m_bHook = FALSE; g_hwndClock = NULL;
if(GetMyRegLong(NULL, "TaskbarRestart", FALSE))
{
SetTimer(hwnd, IDTIMER_START, 1000, NULL);
m_bStartTimer = TRUE;
}
else
PostMessage(hwnd, WM_CLOSE, 0, 0);
}
/*-------------------------------------------------------
WM_COPYDATA message
---------------------------------------------------------*/
void OnCopyData(HWND hwnd, HWND hwndFrom, COPYDATASTRUCT* pcds)
{
const char *p = (char *)pcds->lpData;
switch(pcds->dwData)
{
case COPYDATA_SOUND:
PlayFileCmdLine(hwnd, p); // common/playfile.c
break;
case COPYDATA_EXEC:
ExecCommandString(hwnd, p); // command.c
break;
}
}